﻿using AlgoritmoConstrutivo.entidades;
using Entidades;
using RandomKeyGenerator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Support
{
    public class Estatistica: IComparable
    {
        private Decimal tempoExecucao;
        private Decimal tempoAntesBuscaLocal;
        private Decimal mq;
        private Decimal mqDepoisBuscaLocal;
        private int idOriginalCromossomo;
        private Decimal mediaMQ;
        private Decimal maiorMqGerado;
        private Decimal tempoObterMq;
        private int geracao;
        private int individuo;
        private double mutante;
        private int numClustersGerados;
        private int numClustersUnitarios;
        private int numNos;
        private int qtdeIndividuos;
        private int infoExecucao;
        private int qtdeExecucoesBRKGA;
        private Gene[] chaves;
        private Cromossomo cromossomo;
        private Configuration2 cfg;
        private Grafo software;
        private double seed;
        private int numTotalGeracoes;

       


        private List<int> ordemVisitacaoCabecasChave = new List<int>();

      

      
        public Estatistica()
        {
         
        }

        public Estatistica(int infoExecucao, int qtdeExecucoesBRKGA, int qtdeIndividuos)
        {
            this.infoExecucao = infoExecucao;
            this.qtdeIndividuos = qtdeIndividuos;
            this.qtdeExecucoesBRKGA = qtdeExecucoesBRKGA;

        }

        public Estatistica(int infoExecucao, Decimal mq)
        {
            this.infoExecucao = infoExecucao;
            this.mq = mq;
            this.maiorMqGerado = this.mq;
        }

        public int NumTotalGeracoes
        {
            get { return numTotalGeracoes; }
            set { numTotalGeracoes = value; }
        }

        public double Seed
        {
            get { return seed; }
            set { seed = value; }
        }

        public Configuration2 Cfg
        {
            get { return cfg; }
            set { cfg = value; }
        }

        public Grafo Software
        {
            get { return software; }
            set { software = value; }
        }

        public Gene[] Chaves
        {
            get { return chaves; }
            set { chaves = value; }
        }

        public Decimal MqDepoisBuscaLocal
        {
            get { return mqDepoisBuscaLocal; }
            set { mqDepoisBuscaLocal = value; }
        }

        public int Individuo
        {
            get { return individuo; }
            set { individuo = value; }
        }

        public List<int> OrdemVisitacaoCabecasChave
        {
            get { return ordemVisitacaoCabecasChave; }
            set { ordemVisitacaoCabecasChave = value; }
        }



        public void CalculaMediaMQ()
        {
            this.mediaMQ = this.mq / 100;
        }

        public int NumNos
        {
            get { return numNos; }
            set { numNos = value; }
        }

        public Decimal TempoExecucao
        {
            get { return tempoExecucao; }
            set { tempoExecucao = value; }
        }

        public int Geracao
        {
            get { return geracao; }
            set { geracao = value; }
        }

        public Decimal TempoObterMq
        {
            get { return tempoObterMq; }
            set { tempoObterMq = value; }
        }

        public Decimal Mq
        {
            get { return mq; }

            set 
            {
                mq = value; }

        }

        public double Mutante
        {
            get { return mutante; }
            set { mutante = value; }
        }
        private double elite;

        public double Elite
        {
            get { return elite; }
            set { elite = value; }
        }

        public int IdOriginalCromossomo
        {
            get { return idOriginalCromossomo; }
            set { idOriginalCromossomo = value; }
        }

        public int CompareTo(object obj)
        {
            Estatistica gr = obj as Estatistica;

            if (gr.mq > this.mq)
                return 1;

            else if (gr.mq == this.mq)
                return 0;
            else
                return -1;
        }

        public Decimal MediaMQ
        {
            get { return mediaMQ; }
            set { mediaMQ = value; }
        }

        public Decimal MaiorMqGerado
        {
            get { return maiorMqGerado; }
  
        }

        public int NumClustersUnitarios
        {
            get { return numClustersUnitarios; }
            set { numClustersUnitarios = value; }
        }

        public Cromossomo Cromossomo
        {
            get { return cromossomo; }
            set { cromossomo = value; }
        }

        public int NumClustersGerados
        {
            get { return numClustersGerados; }
            set { numClustersGerados = value; }
        }

        public override string ToString()
        {

            String a = String.Format("{0:C4}", this.mqDepoisBuscaLocal);

            return (this.mq.ToString("N5") + ";" + this.mqDepoisBuscaLocal.ToString("N5") + ";" + this.tempoObterMq + ";" + this.tempoExecucao + ";" + ++this.geracao + ";" + this.numTotalGeracoes +
            ";"+ this.numNos + ";" + this.numClustersGerados + ";" + this.numClustersUnitarios + ";" + this.cfg.Id +";" + this.seed+";"+this.mutante + ";"+this.elite);
        }



        public int Value { get; set; }
    }
}
